package juc;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author lzy
 * Create DateTime: 2018/7/16 22:04
 * @version v1.0
 *
 * 一、i++的原子性问题：i++的操作实际分为是哪个步骤“读-写-改”
 *    int i = 10;
 *    i = i++;
 *
 *    int temp = i;
 *    i = i+1;
 *    i = temp;
 *
 * 二、原子变量：jdk1.5后j.u.c包中提供了常用的原子变量：
 *    1. volatile保证内存可见性
 *    2. CAS (Compare-and-swap)算法保证数据的原子性
 *    CAS算法是硬件对于并发操作共享数据的支持
 *    CAS包含了三个操作数：
 *    内存值 V
 *    预估值 A
 *    更新值 B
 *    先读取一次内存值V，然后进行第二步进行比较和设置
 *    当且仅当V==A时，V = B，否则将不做任何操作
 *    CAS算法与锁不同，不需要阻塞，不需要放弃CPU分配的执行权，可以继续尝试
 */
public class TestAtomicDemo {

    public static void main(String[] args) {
        AtomicDemo ad = new AtomicDemo();
        for (int i = 0; i < 10; i++) {
            new Thread(ad).start();
        }
    }
}

class AtomicDemo implements Runnable {
//    private volatile int serialNumber = 0;
    private AtomicInteger serialNumber = new AtomicInteger(0);

    @Override
    public void run() {
        try {
            TimeUnit.MILLISECONDS.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName() + ":" + getSerialNumber());
    }

    public int getSerialNumber() {
        return serialNumber.getAndIncrement();
    }
}
